CP=g++
CC=gcc
FLEX=flex
BISON=bison
CFLAGS=-W -Wall -ansi -pedantic
LDFLAGS=-lSDL -lGL -lGLU -ll -ly
EXEC=customquadric
SRC=$(wildcard *.cpp) $(wildcard */*.cpp)
COMPILEDIR=compiler
OBJ=$(COMPILEDIR)/lex.yy.o $(COMPILEDIR)/$(EXEC).tab.o $(SRC:.cpp=.o)

all: $(EXEC)

$(EXEC): $(OBJ)
	$(CP) -o $@ $^ $(LDFLAGS)

$(COMPILEDIR)/lex.yy.c: $(COMPILEDIR)/$(EXEC).l
	$(FLEX) -o $@ $<

$(COMPILEDIR)/lex.yy.o: $(COMPILEDIR)/lex.yy.c $(COMPILEDIR)/$(EXEC).tab.h
	$(CC) -o $@ -c $< $(CFLAGS)

$(COMPILEDIR)/$(EXEC).tab.h: $(COMPILEDIR)/$(EXEC).y
	$(BISON) -o $@ -d $<

$(COMPILEDIR)/$(EXEC).tab.c: $(COMPILEDIR)/$(EXEC).y
	$(BISON) -o $@ $<

$(COMPILEDIR)/$(EXEC).tab.o: $(COMPILEDIR)/$(EXEC).tab.c
	$(CC) -o $@ -c $< $(CFLAGS)

main.o: main.cpp $(COMPILEDIR)/$(EXEC).tab.h
	$(CP) -o $@ -c $< $(CFLAGS)

%.o: %.cpp
	$(CP) -o $@ -c $< $(CFLAGS)

clean:
	rm -f *.o */*.o $(COMPILEDIR)/$(EXEC).tab.* $(COMPILEDIR)/lex.yy.*

mrproper: clean
	rm -f $(EXEC)
			
